<?php

/**
 * @brief Klasa kontrolera groups
 *
 * Klasa udostepnia interfej CRUD grup
 *
 *
 */
class GroupsController extends Zend_Controller_Action
{
    private $mapper; /*!< Mapper aukcji. */
    private $request; /*!< Parametry zadania. */
    private $_user; /*!< Informacje zalogowanego uzytkownika. */



    /**
     * @brief Metoda inicjujaca
     * 
     * Odpowiedzialan za szeg czynnosci:
     * - Odczyt informacji z flash messnegera
     * - Inicjacje maperow
     * - Odczyt statusu zalogowania
     * - Inicjacje kontekstu ajaxowego niektorych akcji
     */
    public function init()
    {
        /* Initialize action controller here */
        $this->_flashMessenger = $this->_helper->getHelper('FlashMessenger');
        $this->view->messages = $this->_flashMessenger->getMessages();
        
        $this->mapper = new Application_Model_GroupMapper();
        $this->request = $this->getRequest();
        $this->view->render('utility/_headbox.phtml');

        
        $auth = Zend_Auth::getInstance();
        if($auth->hasIdentity()){
            $this->_user = $auth->getIdentity();
        }
    }
    
    /**
     * @brief Akcja index
     * 
     * Akcja bez zastosowania - do ewentualnego
     * wykorzystania w przyszłosci
     */
    public function indexAction()
    {
        // action body
    }

    /**
     * @brief Akcja new
     * 
     * Akcja do tworzenia nowych grup.
     * Grupy powstaja wyklacznie z predefiniowanymi parametrami.
     * Trzeba je potem zmienic jak istanieje taka potrzeba.
     */
    public function newAction()
    {
        // action body
        $offerId = $this->request->getParam('offer');
        $offerMapper = new Application_Model_OfferMapper();
        //$offer = new Application_Model_Offer();
        $offer = $offerMapper->find($offerId);
        if(!$offer->offerOpen()){
            throw new Exception('Oferta zamknieta');
        }
        
        
        $group = new Application_Model_Group;
        $group->setIsMandatory(1);
        $group->setMultipler(1);
        $group->setHeadOffer_id($offer->getHeadOffer_id());
        $group->setMarketEntity_id($this->_user->login);
        $id = $this->mapper->save($group);
        
        //dodac zapis oferty
        $affiliationMapper = new Application_Model_GroupAffiliation();
        $affiliationMapper->save($id, $offerId);
        
        $this->_helper->redirector('edit','groups','default',array('id' => $id));
    }

    /**
     * @brief Akcja new
     * 
     * Akcja do tworzenia nowych grup.
     * Grupy powstaja wyklacznie z predefiniowanymi parametrami.
     * Trzeba je potem zmienic jak istanieje taka potrzeba.
     */
    public function editAction()
    {
        // action body
        $group = $this->getGroup(false);
        $form = new Application_Form_EditGroup();
        if($this->request->isPost()){
            if($form->isValid($this->request->getPost())){
                $values = $form->getValues();
                $group->setOptions($values);
                $this->mapper->save($group);
            }
        }
        $this->view->group = $group;
        $this->view->form = $form;
    }

    /**
     * @brief Akcja show
     * 
     * Akcja do wyswietlania informacji o grupach.
     */
    public function showAction()
    {
        $group = $this->getGroup(false);
        $this->view->group = $group;
    }

    /**
     * @brief Akcja delete
     * 
     * Akcja do usuwania grup. Moze sie do odbywac na dwa sposoby.
     * Albo usuwana jest referancja, jak grupa nalezy do wiecej niz
     * jednej oferty lub calkowicie w innym wypadku.
     * W trym drugim przypadku jak w grupie sa ofert, to usuniecie grupy 
     * nie jest mozliwe. 
     */
    public function deleteAction()
    {
        $group = $this->getGroup(true);
        //$offer = new Application_Model_Offer();
        $id = $group->getGroup_id();
        $head = $group->getHeadOffer_id();
        $offers = $group->getOffers();
        if(empty($offers)) {
            $this->mapper->delete($id);
            $this->_helper->flashMessenger->addMessage('success/Usunięto grupe!');
            $this->_helper->redirector('show', 'offers','default',array('id'=>$head));
        } 
        $this->_helper->flashMessenger->addMessage('error/Nie można usunąć tej grupy!');
        $this->_helper->redirector('edit', 'groups','default',array('id'=>$id));
    }
    
    /**
     * @brief Akcja delete
     * 
     * Akcja do usuwania grup. Moze sie do odbywac na dwa sposoby.
     * Albo usuwana jest referancja, jak grupa nalezy do wiecej niz
     * jednej oferty lub calkowicie w innym wypadku.
     * W trym drugim przypadku jak w grupie sa ofert, to usuniecie grupy 
     * nie jest mozliwe. 
     */
    public function addAction()
    {
        $group = $this->getGroup(true);
        $id = $group->getGroup_id();
        $offerId = $this->request->getParam('offer');
                
        if($this->request->isPost()){
                $affiliationMapper = new Application_Model_GroupAffiliation();
                $affiliationMapper->save($id, $offerId);
                $this->_helper->flashMessenger->addMessage("success/Dołaczono grupę!");
                $this->_helper->redirector('edit','offers','default',array('id'=>$offerId));
        } else {
            $this->_helper->flashMessenger->addMessage("error/Nie udało się dołaczyć grupy!");
            $this->_helper->redirector('index','index');
        }
    }

    /**
     * @brief Metoda sprawdzajaca zalogowanie uzytkownika
     * 
     * Wiekszosc ofert jest chroniona przed dostepem osbo 
     * niepowolanych. Jak dojdzie do sytuacji ze nieodpowiednia osoba bedzie 
     * chciala skorzystac z chronionej akcji to ta metoda to uniemozliwi.
     */
    private function actionIsProtected()
    {
        if(empty($this->_user)) {
            $this->_helper->flashMessenger->addMessage("warning/Zaloguj się!");
            $this->_helper->redirector('login','auth');
        }
    }
    
    /**
     * @brief Metoda sprawdzajaca uprawnienia uzytkownika
     * 
     * Jak uzytkownik nie ma uprawnien do wykonania akcji to
     * zostanie wyrzucony wyjatek.
     */
    private function actionAuthorizedFor($login){
        $loggedUser = $this->_user->login;
        if(empty($loggedUser)||
                $loggedUser != $login)
            throw new Exception('Odmowa dostępu');
    }

    /**
     * @brief Metoda zwracajaca grupe
     * 
     * Metoda odcytuje parametry zadania i na ich podstawie za pomoca
     * mapperow wydobywa z bazy odpowiednia grupe. O ile uzytkownik ma 
     * odpowiednie uprawnienia.
     */
    private function getGroup($protected = FALSE) {
        $id = $this->request->getParam('id');
        //wez aukcje
        $group = $this->mapper->find($id);
        if(empty($group) )
            throw new Zend_Controller_Action_Exception('Nie ma grupy o tym numerze', 404);
        
        if($protected) {
            //sprawdz czy oferta nalezy do uzytkownika
            $this->actionIsProtected();
            $login = $group->getMarketEntity_id();
            $this->actionAuthorizedFor($login);
        }
        
        return $group;
    }



}









